export default {
  // 为当前模块开启命名空间
  namespaced: true,
  // 模块的 state 数据
  state: () => ({
    // 购物车数组，用来存储购物车中每个商品的信息
    cart: uni.getStorageSync('cart') || [],
  }),
  mutations: {
    // goods => { goods_id, goods_name, goods_price, goods_count, goods_small_logo, goods_state }
    addToCart(state, goods) {
      // 先看一下 goods 在不在 state.cart 中，如果在，直接让这个对象 goods_count + 1，否则直接把这个对象添加到数组
      const item = state.cart.find(item => item.goods_id === goods.goods_id)
      if (item) {
        // !注意是往 item 上面加，item 才是找出来的这个对象
        item.goods_count += 1
      } else {
        state.cart.push(goods)
      }
      // 调用当前模块的其他 mutation 方法
      this.commit('m_cart/saveToStorage')
    },
    saveToStorage(state) {
      uni.setStorageSync('cart', state.cart)
    },
    // 根据 goods_id 修改 goods_state 的方法
    updateGoodsState(state, o) {
      const item = state.cart.find(item => item.goods_id === o.goods_id)
      if (item) {
        item.goods_state = o.goods_state
        // 同一个 mutation 方法之间的通信，就是如下的语法
        // 把修改的结果也同步到本地
        this.commit('m_cart/saveToStorage')
      }
    },
    // 根据 goods_id 修改 goods_count 的方法
    updateGoodsCount(state, o) {
      const item = state.cart.find(item => item.goods_id === o.goods_id)
      if (item) {
        item.goods_count = o.goods_count
        // 同一个 mutation 方法之间的通信，就是如下的语法
        // 把修改的结果也同步到本地
        this.commit('m_cart/saveToStorage')
      }
    },
    removeGoodsById(state, o) {
      // const idx = state.cart.findIndex(item => item.goods_id === o.goods_id)
      // state.cart.splice(idx, 1)
      state.cart = state.cart.filter(item => item.goods_id !== o.goods_id)
      this.commit('m_cart/saveToStorage')
    },
    // 点击全选时修改单选的状态
    updateAllGoodsState(state, goods_state) {
      state.cart.forEach(item => item.goods_state = goods_state)
      this.commit('m_cart/saveToStorage')
    }
  },
  getters: {
    // 总数量
    total(state) {
      return state.cart.reduce((acc, cur) => acc + cur.goods_count, 0)
    },
    // 选中的总数量
    checkedCount(state) {
      return state.cart.filter(item => item.goods_state).reduce((acc, cur) => acc + cur.goods_count, 0)
    },
    // 选中的总价钱
    checkedMoney(state) {
      return state.cart.filter(item => item.goods_state).reduce((acc, cur) => acc + cur.goods_count * cur.goods_price,
        0)
    }
  }
}
